/**
 * @param {TreeNode} root
 * @return {number}
 */
var minCameraCover = function (root) {
    let count = 0
    // 状态有3中, 
    // 0 第一种没有监控
    // 1 正在监控
    // 2 子元素有监控,相当于被覆盖
    function recursion(root) {
        if (!root) return null

        root.left = recursion(root.left)
        root.right = recursion(root.right)

        if (!root.left && !root.right) {
            // 说明当前是叶节点
            root.state = 0
        }

        if (root.left && root.right) {
            if (root.left.state === 0 || root.right.state === 0) {
                // 覆盖 (0,0)(0,2)(2,0)(1,0)
                count++
                root.state = 1
            } else if (root.left.state === 1 || root.right.state === 1) {
                // 这个判断覆盖了  (1,1)  (1,2)
                root.state = 2
            } else if (root.left.state === 2 && root.right.state === 2) {
                // 这个判断覆盖了 (2,2)
                root.state = 0
            }
        }

        // 下面是只有一个单个子节点

        if(!root.left && root.right){
            if(root.right.state === 0) {
                count++
                root.state=1
            }
            if(root.right.state === 1) root.state=2
            if(root.right.state === 2) root.state=0
        }

        if(root.left && !root.right){
            if(root.left.state === 0) {
                count++
                root.state=1
            }
            if(root.left.state === 1) root.state=2
            if(root.left.state === 2) root.state=0
        }

        return root
    }
    let r = recursion(root)

    if(r.state===0){
        count++
    }
    return count
};